package com.easy.project.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import com.easy.project.service.system.ISysAuthService;
import com.easy.project.util.SaTokenUtils;
import com.easy.project.util.ServletUtils;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;
import java.util.List;

/**
 * sa-token 配置
 */
@Configuration
@Data
public class SaTokenConfig implements WebMvcConfigurer {

    @Resource
    private AuthConfig authConfig;

    @Resource
    private ISysAuthService sysAuthService;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // sa-token 拦截器
        registry.addInterceptor(new SaInterceptor(handle -> {
            List<String> whiteUrl = authConfig.getWhiteUrl();
            // 登录校验
            SaRouter
                    .match("/**")
                    .notMatch(whiteUrl)
                    .check(r -> StpUtil.checkLogin());
            // 权限校验
            if (StpUtil.isLogin()){
                if (SaTokenUtils.isAdmin()){
                    // 是管理员则所有接口都放行
                    SaRouter.notMatch("/**");
                }else {
                    // 检验当前用户是否有此接口的权限
                    String servletPath = ServletUtils.getServletPath();
                    SaRouter.match("/**")
                            .notMatch(whiteUrl)
                            .check(r -> StpUtil.checkPermission(servletPath));
                    // todo 设计严格模式：没有在菜单管理的接口一律提示没有权限  非严格模式：只有在菜单接口管理才进行权限管理，没有在菜单管理里面的接口则不进行权限校验
                }
            }
        })).addPathPatterns("/**");
    }

    /**
     * 整合jwt 只存放用户不经常修改的信息
     * @return
     */
    @Bean
    public StpLogic getStpLogicJwt(){
        return new StpLogicJwtForSimple();
    }
}
